νμ₯ κ°λ₯νκ³ , 볡μλ ₯ μμΌλ©°, λΆλ¦¬λ μμ€ν ꡬμΆμ μν λ€μν μ κ·Ό λ°©μμ νμνλ μ΄λ²€νΈ κΈ°λ° μν€ν μ² λ©μμ§ ν¨ν΄ μ’ ν© κ°μ΄λ. κΈλ‘λ² κ°λ°νμ μν μ€μ©μ μΈ μμ μ λͺ¨λ² μ¬λ‘λ₯Ό ν¬ν¨ν©λλ€.
μ΄λ²€νΈ κΈ°λ° μν€ν μ²: νμ₯ κ°λ₯ν μμ€ν μ μν λ©μμ§ ν¨ν΄ λ§μ€ν°νκΈ°
μ΄λ²€νΈ κΈ°λ° μν€ν μ²(Event-Driven Architecture, EDA)λ μ΄λ²€νΈμ μμ°, κ°μ§, μλΉλ₯Ό μ€μ¬μΌλ‘ νλ μννΈμ¨μ΄ μν€ν μ² ν¨λ¬λ€μμ λλ€. κΈ΄λ°νκ² κ²°ν©λ μλΉμ€ μνΈμμ© λμ , EDAλ λΉλκΈ° ν΅μ μ μ΄μ§νμ¬ λ νμ₯ κ°λ₯νκ³ , 볡μλ ₯ μμΌλ©°, λΆλ¦¬λ μμ€ν μ λ§λλλ€. EDAμ ν΅μ¬ κ΅¬μ± μμλ λ©μμ§ ν¨ν΄μ ν¨κ³Όμ μΈ νμ©μ λλ€. μ΄ κ°μ΄λλ EDAμμ μΌλ°μ μΌλ‘ μ¬μ©λλ λ€μν λ©μμ§ ν¨ν΄μ νμνκ³ , κΈλ‘λ² κ°λ°νμ μν μ€μ©μ μΈ μμ μ λͺ¨λ² μ¬λ‘λ₯Ό μ 곡ν©λλ€.
μ΄λ²€νΈ κΈ°λ° μν€ν μ²λ 무μμΈκ°?
μ ν΅μ μΈ μμ²/μλ΅ μν€ν μ²μμλ μλΉμ€κ° μλ‘ μ§μ νΈμΆν©λλ€. μ΄λ¬ν κ°ν κ²°ν©μ λ³λͺ© νμμ μ λ°νκ³ μμ€ν μ μ·¨μ½νκ² λ§λ€ μ μμ΅λλ€. λ°λ©΄μ EDAλ μ΄λ²€νΈ λ²μ€λ λ©μμ§ λΈλ‘컀λ₯Ό λμ νμ¬ μλΉμ€λ₯Ό λΆλ¦¬(λ컀νλ§)ν©λλ€. μλΉμ€λ λ²μ€μ μ΄λ²€νΈλ₯Ό λ°ννμ¬ ν΅μ νκ³ , λ€λ₯Έ μλΉμ€λ€μ κ΄μ¬ μλ μ΄λ²€νΈλ₯Ό ꡬλ ν©λλ€. μ΄λ¬ν λΉλκΈ° ν΅μ μ μλΉμ€κ° λ 립μ μΌλ‘ μλνλλ‘ νμ¬ νμ₯μ±κ³Ό λ΄κ²°ν¨μ±μ ν₯μμν΅λλ€.
EDAμ μ£Όμ μ΄μ
- λ컀νλ§(Decoupling): μλΉμ€λ λ 립μ μ΄λ©° μλ‘μ λν΄ μ νμκ° μμ΅λλ€.
- νμ₯μ±(Scalability): κ°λ³ μλΉμ€λ₯Ό μμμ λ°λΌ λ 립μ μΌλ‘ νμ₯ν μ μμ΅λλ€.
- 볡μλ ₯(Resilience): ν μλΉμ€μ μ₯μ κ° λ€λ₯Έ μλΉμ€μ λ°λμ μν₯μ λ―ΈμΉμ§λ μμ΅λλ€.
- μ μ°μ±(Flexibility): κΈ°μ‘΄ μλΉμ€μ μν₯μ μ£Όμ§ μκ³ μλ‘μ΄ μλΉμ€λ₯Ό μΆκ°νκ±°λ μ κ±°ν μ μμ΅λλ€.
- μ€μκ° λ°μμ±(Real-time responsiveness): μλΉμ€κ° κ±°μ μ€μκ°μΌλ‘ μ΄λ²€νΈμ λ°μν μ μμ΅λλ€.
μ΄λ²€νΈ κΈ°λ° μν€ν μ²μ μΌλ°μ μΈ λ©μμ§ ν¨ν΄
EDAμμλ μ¬λ¬ λ©μμ§ ν¨ν΄μ μ¬μ©ν μ μμΌλ©°, κ°κ° μ₯λ¨μ μ΄ μμ΅λλ€. μ¬λ°λ₯Έ ν¨ν΄μ μ ννλ κ²μ μ ν리μΌμ΄μ μ νΉμ μꡬμ¬νμ λ°λΌ λ¬λΌμ§λλ€.
1. λ°ν-ꡬλ (Publish-Subscribe, Pub-Sub)
λ°ν-ꡬλ ν¨ν΄μ EDAμμ κ°μ₯ κΈ°λ³Έμ μΈ λ©μμ§ ν¨ν΄ μ€ νλμ λλ€. μ΄ ν¨ν΄μμ λ°νμ(publisher)λ ν ν½(topic)μ΄λ κ΅νκΈ°(exchange)μ λ©μμ§λ₯Ό μμ°νκ³ , ꡬλ μ(subscriber)λ νΉμ ν ν½μ λν κ΄μ¬μ λ±λ‘ν©λλ€. κ·Έλ¬λ©΄ λ©μμ§ λΈλ‘컀λ λ°νμλ‘λΆν° λͺ¨λ κ΄μ¬ μλ ꡬλ μμκ² λ©μμ§λ₯Ό λΌμ°ν ν©λλ€.
μμ
μ μμκ±°λ νλ«νΌμ μλ‘ λ€μ΄ λ³΄κ² μ΅λλ€. κ³ κ°μ΄ μ£Όλ¬Έμ νλ©΄ "OrderCreated" μ΄λ²€νΈκ° "Orders" ν ν½μΌλ‘ λ°νλ©λλ€. μ¬κ³ μλΉμ€, κ²°μ μλΉμ€, λ°°μ‘ μλΉμ€μ κ°μ μλΉμ€λ€μ "Orders" ν ν½μ ꡬλ νκ³ κ·Έμ λ°λΌ μ΄λ²€νΈλ₯Ό μ²λ¦¬ν©λλ€.
ꡬν
Pub-Subμ Apache Kafka, RabbitMQμ κ°μ λ©μμ§ λΈλ‘컀λ AWS SNS/SQS, Azure Service Busμ κ°μ ν΄λΌμ°λ κΈ°λ° λ©μμ§ μλΉμ€λ₯Ό μ¬μ©νμ¬ κ΅¬νν μ μμ΅λλ€. ꡬ체μ μΈ κ΅¬ν μΈλΆ μ 보λ μ νν κΈ°μ μ λ°λΌ λ€λ¦ λλ€.
μ₯μ
- λ컀νλ§: λ°νμμ ꡬλ μκ° μμ ν λΆλ¦¬λ©λλ€.
- νμ₯μ±: λ°νμμκ² μν₯μ μ£Όμ§ μκ³ κ΅¬λ μλ₯Ό μΆκ°νκ±°λ μ κ±°ν μ μμ΅λλ€.
- μ μ°μ±: κΈ°μ‘΄ μλΉμ€λ₯Ό λ³κ²½ν νμ μμ΄ μλ‘μ΄ μ΄λ²€νΈ μ νμ λμ ν μ μμ΅λλ€.
λ¨μ
- 볡μ‘μ±: λκ·λͺ¨ μμ€ν μμλ ν ν½κ³Ό ꡬλ μ κ΄λ¦¬νλ κ²μ΄ 볡μ‘ν΄μ§ μ μμ΅λλ€.
- μ΅μ’ μΌκ΄μ±(Eventual Consistency): ꡬλ μκ° μ΄λ²€νΈλ₯Ό μ¦μ μμ νμ§ λͺ»ν μ μμΌλ©°, μ΄λ μ΅μ’ μΌκ΄μ±μΌλ‘ μ΄μ΄μ§λλ€.
2. μ΄λ²€νΈ μμ±(Event Sourcing)
μ΄λ²€νΈ μμ±μ μ ν리μΌμ΄μ μνμ λν λͺ¨λ λ³κ²½ μ¬νμ μΌλ ¨μ μ΄λ²€νΈλ‘ μΊ‘μ²νλ ν¨ν΄μ λλ€. μ ν리μΌμ΄μ μ μν°ν°μ νμ¬ μνλ₯Ό μ μ₯νλ λμ , ν΄λΉ μνμ μ΄λ₯΄κ² ν μ΄λ²€νΈμ κΈ°λ‘μ μ μ₯ν©λλ€. νμ¬ μνλ μ΄λ²€νΈλ₯Ό μ¬μ€ν(replaying)νμ¬ μ¬κ΅¬μ±ν μ μμ΅λλ€.
μμ
μν μ ν리μΌμ΄μ μ μκ°ν΄ λ΄ μλ€. μ ν리μΌμ΄μ μ κ³μ’μ νμ¬ μμ‘μ μ μ₯νλ λμ , "μ κΈ", "μΆκΈ", "μ΄μ²΄"μ κ°μ μ΄λ²€νΈλ₯Ό μ μ₯ν©λλ€. νμ¬ μμ‘μ μ΄λ¬ν μ΄λ²€νΈλ₯Ό μμλλ‘ μ¬μ€ννμ¬ κ³μ°ν μ μμ΅λλ€.
ꡬν
μ΄λ²€νΈ μμ±μ μΌλ°μ μΌλ‘ μ΄λ²€νΈλ₯Ό μ μ₯νκ³ κ²μνλ λ° μ΅μ νλ νΉμ λ°μ΄ν°λ² μ΄μ€μΈ μ΄λ²€νΈ μ€ν μ΄μ μ΄λ²€νΈλ₯Ό μ μ₯νλ κ²μ ν¬ν¨ν©λλ€. Apache Kafkaλ λμ©λ μ΄λ²€νΈλ₯Ό μ²λ¦¬νκ³ κ°λ ₯ν μμ 보μ₯μ μ 곡νλ λ₯λ ₯ λλ¬Έμ μ’ μ’ μ΄λ²€νΈ μ€ν μ΄λ‘ μ¬μ©λ©λλ€.
μ₯μ
- κ°μ¬ μ©μ΄μ±(Auditability): λͺ¨λ λ³κ²½ μ΄λ ₯μ μ¬μ©ν μ μμ΅λλ€.
- λλ²κΉ : μ΄λ²€νΈλ₯Ό μ¬μ€ννμ¬ λ¬Έμ λ₯Ό λ μ½κ² λλ²κΉ ν μ μμ΅λλ€.
- μκ°μ 쿼리(Temporal queries): νΉμ μμ μ μ ν리μΌμ΄μ μνλ₯Ό 쿼리ν μ μμ΅λλ€.
- μ¬μ€ν κ°λ₯μ±(Replayability): μ΄λ²€νΈλ₯Ό μ¬μ€ννμ¬ μνλ₯Ό μ¬κ΅¬μΆνκ±°λ μλ‘μ΄ νλ‘μ μ μ λ§λ€ μ μμ΅λλ€.
λ¨μ
- 볡μ‘μ±: μ΄λ²€νΈ μμ± κ΅¬νμ 볡μ‘ν μ μμ΅λλ€.
- μ μ₯ 곡κ°: λλμ μ΄λ²€νΈ λ°μ΄ν°λ₯Ό μ μ₯ν΄μΌ ν©λλ€.
- 쿼리: μ΄λ²€νΈ μ€ν μ΄λ₯Ό 쿼리νλ κ²μ΄ μ΄λ €μΈ μ μμ΅λλ€.
3. λͺ λ Ή 쿼리 μ± μ λΆλ¦¬(CQRS)
CQRSλ λ°μ΄ν° μ μ₯μμ λν μ½κΈ° λ° μ°κΈ° μμ μ λΆλ¦¬νλ ν¨ν΄μ λλ€. μ°κΈ° μμ μ μ²λ¦¬νκΈ° μν 컀맨λ λͺ¨λΈκ³Ό μ½κΈ° μμ μ μ²λ¦¬νκΈ° μν 쿼리 λͺ¨λΈμ΄λΌλ λ κ°μ κ³ μ ν λͺ¨λΈμ μ μν©λλ€. μ΄λ¬ν λΆλ¦¬λ₯Ό ν΅ν΄ κ° λͺ¨λΈμ νΉμ λͺ©μ μ λ§κ² μ΅μ νν μ μμ΅λλ€.
μμ
μ μμκ±°λ μ ν리μΌμ΄μ μμ 컀맨λ λͺ¨λΈμ μ£Όλ¬Έ μμ±, μ ν μ 보 μ λ°μ΄νΈ, κ²°μ μ²λ¦¬μ κ°μ μμ μ μ²λ¦¬ν μ μμ΅λλ€. 쿼리 λͺ¨λΈμ μ ν λͺ©λ‘ νμ, μ£Όλ¬Έ λ΄μ μ‘°ν, λ³΄κ³ μ μμ±κ³Ό κ°μ μμ μ μ²λ¦¬ν μ μμ΅λλ€.
ꡬν
CQRSλ μ’ μ’ μ΄λ²€νΈ μμ±κ³Ό ν¨κ» μ¬μ©λ©λλ€. 컀맨λλ μ΄λ²€νΈλ₯Ό νΈλ¦¬κ±°νλ λ° μ¬μ©λλ©°, μ΄ μ΄λ²€νΈλ μ½κΈ° λͺ¨λΈμ μ λ°μ΄νΈνλ λ° μ¬μ©λ©λλ€. μ½κΈ° λͺ¨λΈμ νΉμ 쿼리 ν¨ν΄μ μ΅μ νλμ΄ λ λΉ λ₯΄κ³ ν¨μ¨μ μΈ μ½κΈ° μ±λ₯μ μ 곡ν μ μμ΅λλ€.
μ₯μ
- μ±λ₯: μ½κΈ° λ° μ°κΈ° μμ μ λ 립μ μΌλ‘ μ΅μ νν μ μμ΅λλ€.
- νμ₯μ±: μ½κΈ° λ° μ°κΈ° λͺ¨λΈμ λ 립μ μΌλ‘ νμ₯ν μ μμ΅λλ€.
- μ μ°μ±: μ½κΈ° λ° μ°κΈ° λͺ¨λΈμ΄ λ 립μ μΌλ‘ λ°μ ν μ μμ΅λλ€.
λ¨μ
- 볡μ‘μ±: CQRSλ₯Ό ꡬννλ©΄ 볡μ‘μ±μ΄ ν¬κ² μ¦κ°ν μ μμ΅λλ€.
- μ΅μ’ μΌκ΄μ±: μ½κΈ° λͺ¨λΈμ΄ μ°κΈ° λͺ¨λΈκ³Ό μ¦μ μΌμΉνμ§ μμ μ μμ΅λλ€.
4. μμ²-μλ΅(Request-Reply)
EDAλ λΉλκΈ° ν΅μ μ μ₯λ €νμ§λ§, μμ²-μλ΅ ν¨ν΄μ΄ μ¬μ ν νμν μλ리μ€κ° μμ΅λλ€. μ΄ ν¨ν΄μμ ν μλΉμ€λ λ€λ₯Έ μλΉμ€μ μμ² λ©μμ§λ₯Ό 보λ΄κ³ μλ΅ λ©μμ§λ₯Ό κΈ°λ€λ¦½λλ€.
μμ
μ¬μ©μ μΈν°νμ΄μ€κ° λ°±μλ μλΉμ€μ μ¬μ©μ νλ‘ν μ 보λ₯Ό κ²μνκΈ° μν΄ μμ²μ λ³΄λΌ μ μμ΅λλ€. λ°±μλ μλΉμ€λ μμ²μ μ²λ¦¬νκ³ μ¬μ©μ νλ‘ν λ°μ΄ν°κ° ν¬ν¨λ μλ΅μ 보λ λλ€.
ꡬν
μμ²-μλ΅ ν¨ν΄μ RabbitMQμ κ°μ΄ μμ²-μλ΅ μ맨ν±μ μ§μνλ λ©μμ§ λΈλ‘컀λ₯Ό μ¬μ©νμ¬ κ΅¬νν μ μμ΅λλ€. μμ² λ©μμ§μλ μΌλ°μ μΌλ‘ μκ΄κ΄κ³ ID(correlation ID)κ° ν¬ν¨λλ©°, μ΄λ μλ΅ λ©μμ§λ₯Ό μλ μμ²κ³Ό μΌμΉμν€λ λ° μ¬μ©λ©λλ€.
μ₯μ
- λ¨μν¨: λ€λ₯Έ λ©μμ§ ν¨ν΄μ λΉν΄ ꡬνμ΄ λΉκ΅μ κ°λ¨ν©λλ€.
- λκΈ°μκ³Ό μ μ¬: λΉλκΈ° λ©μμ§ μΈνλΌλ₯Ό ν΅ν΄ λκΈ°μκ³Ό μ μ¬ν μνΈμμ©μ μ 곡ν©λλ€.
λ¨μ
- κ°ν κ²°ν©: μμ λΉλκΈ° ν¨ν΄μ λΉν΄ μλΉμ€κ° λ κΈ΄λ°νκ² κ²°ν©λ©λλ€.
- λΈλ‘νΉ(Blocking): μμ²νλ μλΉμ€λ μλ΅μ κΈ°λ€λ¦¬λ λμ λΈλ‘νΉλ©λλ€.
5. μ¬κ°(Saga)
μ¬κ°λ μ¬λ¬ μλΉμ€μ κ±ΈμΉ μ₯κΈ° μ€ν νΈλμμ μ κ΄λ¦¬νκΈ° μν ν¨ν΄μ λλ€. λΆμ° μμ€ν μμ λ¨μΌ νΈλμμ μ μ¬λ¬ λ°μ΄ν°λ² μ΄μ€λ μλΉμ€μ λν μ λ°μ΄νΈλ₯Ό ν¬ν¨ν μ μμ΅λλ€. μ¬κ°λ μ₯μ λ°μ μμλ μ΄λ¬ν μ λ°μ΄νΈκ° μΌκ΄λ λ°©μμΌλ‘ μνλλλ‘ λ³΄μ₯ν©λλ€.
μμ
μ μμκ±°λ μ£Όλ¬Έ μ²λ¦¬ μλ리μ€λ₯Ό μκ°ν΄ λ΄ μλ€. μ¬κ°μλ λ€μ λ¨κ³κ° ν¬ν¨λ μ μμ΅λλ€: 1. μ£Όλ¬Έ μλΉμ€μμ μ£Όλ¬Έ μμ±. 2. μ¬κ³ μλΉμ€μμ μ¬κ³ μμ½. 3. κ²°μ μλΉμ€μμ κ²°μ μ²λ¦¬. 4. λ°°μ‘ μλΉμ€μμ μ£Όλ¬Έ λ°°μ‘.
μ΄ λ¨κ³ μ€ νλλΌλ μ€ν¨νλ©΄, μ¬κ°λ μ΄μ λ¨κ³λ₯Ό 보μ(compensate)νμ¬ μμ€ν μ΄ μΌκ΄λ μνλ₯Ό μ μ§νλλ‘ ν΄μΌ ν©λλ€. μλ₯Ό λ€μ΄, κ²°μ κ° μ€ν¨νλ©΄ μ¬κ°λ μ£Όλ¬Έμ μ·¨μνκ³ μμ½λ μ¬κ³ λ₯Ό ν΄μ ν΄μΌ ν©λλ€.
ꡬν
μ¬κ°λ₯Ό ꡬννλ λ°λ λ κ°μ§ μ£Όμ μ κ·Ό λ°©μμ΄ μμ΅λλ€: 1. μ½λ μ€κ·ΈλνΌ κΈ°λ° μ¬κ°(Choreography-based saga): μ¬κ°μ κ΄λ ¨λ κ° μλΉμ€λ μ¬κ°μ λ€μ λ¨κ³λ₯Ό νΈλ¦¬κ±°νλ μ΄λ²€νΈλ₯Ό λ°νν μ± μμ΄ μμ΅λλ€. μ€μ μ€μΌμ€νΈλ μ΄ν°κ° μμ΅λλ€. 2. μ€μΌμ€νΈλ μ΄μ κΈ°λ° μ¬κ°(Orchestration-based saga): μ€μ μ€μΌμ€νΈλ μ΄ν° μλΉμ€κ° μ¬κ°λ₯Ό κ΄λ¦¬νκ³ κ΄λ ¨λ λ¨κ³λ₯Ό μ‘°μ ν©λλ€. μ€μΌμ€νΈλ μ΄ν°λ μ°Έμ¬νλ μλΉμ€μ 컀맨λλ₯Ό 보λ΄κ³ κ° λ¨κ³μ μ±κ³΅ λλ μ€ν¨λ₯Ό λνλ΄λ μ΄λ²€νΈλ₯Ό μμ ν©λλ€.
μ₯μ
- μΌκ΄μ±: μ¬λ¬ μλΉμ€μ κ±Έμ³ λ°μ΄ν° μΌκ΄μ±μ 보μ₯ν©λλ€.
- λ΄κ²°ν¨μ±: μ₯μ λ₯Ό μ μμ μΌλ‘ μ²λ¦¬νκ³ μμ€ν μ΄ μΌκ΄λ μνλ‘ λ³΅κ΅¬λλλ‘ λ³΄μ₯ν©λλ€.
λ¨μ
- 볡μ‘μ±: νΉν μ₯κΈ° μ€ν νΈλμμ μ κ²½μ° μ¬κ°λ₯Ό ꡬννλ κ²μ΄ 볡μ‘ν μ μμ΅λλ€.
- 보μ λ‘μ§: μ€ν¨ν λ¨κ³μ ν¨κ³Όλ₯Ό λλ리기 μν 보μ λ‘μ§μ ꡬνν΄μΌ ν©λλ€.
μ¬λ°λ₯Έ λ©μμ§ ν¨ν΄ μ ννκΈ°
λ©μμ§ ν¨ν΄μ μ νμ μ ν리μΌμ΄μ μ νΉμ μꡬμ¬νμ λ°λΌ λ¬λΌμ§λλ€. κ²°μ μ λ΄λ¦΄ λ λ€μ μμλ₯Ό κ³ λ €νμμμ€:
- μΌκ΄μ± μꡬμ¬ν: κ°ν μΌκ΄μ±μ΄ νμν©λκΉ, μλλ©΄ μ΅μ’ μΌκ΄μ±μΌλ‘ μΆ©λΆν©λκΉ?
- μ§μ° μκ° μꡬμ¬ν: μλΉμ€κ° μ΄λ²€νΈμ μΌλ§λ 빨리 μλ΅ν΄μΌ ν©λκΉ?
- 볡μ‘μ±: ν¨ν΄μ ꡬννκ³ μ μ§ κ΄λ¦¬νλ κ²μ΄ μΌλ§λ 볡μ‘ν©λκΉ?
- νμ₯μ±: ν¨ν΄μ΄ λλμ μ΄λ²€νΈλ₯Ό μ²λ¦¬νκΈ° μν΄ μΌλ§λ μ νμ₯λ©λκΉ?
- λ΄κ²°ν¨μ±: ν¨ν΄μ΄ μ₯μ λ₯Ό μΌλ§λ μ μ²λ¦¬ν©λκΉ?
κ° λ©μμ§ ν¨ν΄μ μ£Όμ νΉμ§μ μμ½ν νλ λ€μκ³Ό κ°μ΅λλ€:
| ν¨ν΄ | μ€λͺ | μΌκ΄μ± | 볡μ‘μ± | μ¬μ© μ¬λ‘ |
|---|---|---|---|---|
| Pub-Sub | λ°νμλ ν ν½μ λ©μμ§λ₯Ό 보λ΄κ³ , ꡬλ μλ ν ν½μμ λ©μμ§λ₯Ό λ°μ΅λλ€. | μ΅μ’ μ | μ€κ° | μλ¦Ό, μ΄λ²€νΈ λ°°ν¬, μλΉμ€ λ컀νλ§. |
| μ΄λ²€νΈ μμ± | μ ν리μΌμ΄μ μνμ λν λͺ¨λ λ³κ²½ μ¬νμ μΌλ ¨μ μ΄λ²€νΈλ‘ μ μ₯ν©λλ€. | κ°ν¨ | λμ | κ°μ¬, λλ²κΉ , μκ°μ 쿼리, μν μ¬κ΅¬μΆ. |
| CQRS | μ½κΈ° λ° μ°κΈ° μμ μ λ³κ°μ λͺ¨λΈλ‘ λΆλ¦¬ν©λλ€. | μ΅μ’ μ (μ½κΈ° λͺ¨λΈμ κ²½μ°) | λμ | μ½κΈ° λ° μ°κΈ° μ±λ₯ μ΅μ ν, μ½κΈ° λ° μ°κΈ° μμ λ 립μ νμ₯. |
| μμ²-μλ΅ | μλΉμ€κ° μμ²μ 보λ΄κ³ μλ΅μ κΈ°λ€λ¦½λλ€. | μ¦κ°μ | λ¨μ | λΉλκΈ° λ©μμ§μ ν΅ν λκΈ°μκ³Ό μ μ¬ν μνΈμμ©. |
| μ¬κ° | μ¬λ¬ μλΉμ€μ κ±ΈμΉ μ₯κΈ° μ€ν νΈλμμ μ κ΄λ¦¬ν©λλ€. | μ΅μ’ μ | λμ | λΆμ° νΈλμμ , μ¬λ¬ μλΉμ€μ κ±ΈμΉ λ°μ΄ν° μΌκ΄μ± 보μ₯. |
EDA λ©μμ§ ν¨ν΄ ꡬνμ μν λͺ¨λ² μ¬λ‘
EDA λ©μμ§ ν¨ν΄μ ꡬνν λ κ³ λ €ν΄μΌ ν λͺ κ°μ§ λͺ¨λ² μ¬λ‘λ λ€μκ³Ό κ°μ΅λλ€:
- μ¬λ°λ₯Έ λ©μμ§ λΈλ‘컀 μ ν: μ ν리μΌμ΄μ μ μꡬμ¬νμ μΆ©μ‘±νλ λ©μμ§ λΈλ‘컀λ₯Ό μ ννμμμ€. νμ₯μ±, μ λ’°μ±, κΈ°λ₯ μΈνΈμ κ°μ μμλ₯Ό κ³ λ €νμμμ€. μΈκΈ° μλ μ΅μ μΌλ‘λ Apache Kafka, RabbitMQ, ν΄λΌμ°λ κΈ°λ° λ©μμ§ μλΉμ€κ° μμ΅λλ€.
- λͺ νν μ΄λ²€νΈ μ€ν€λ§ μ μ: μλΉμ€κ° μ΄λ²€νΈλ₯Ό μ¬λ°λ₯΄κ² μ΄ν΄νκ³ μ²λ¦¬ν μ μλλ‘ λͺ ννκ³ μ μ μλ μ΄λ²€νΈ μ€ν€λ§λ₯Ό μ μνμμμ€. μ€ν€λ§ λ μ§μ€νΈλ¦¬λ₯Ό μ¬μ©νμ¬ μ΄λ²€νΈ μ€ν€λ§λ₯Ό κ΄λ¦¬νκ³ κ²μ¦νμμμ€.
- λ©±λ±μ± μλΉμ ꡬν: μλΉμκ° λ©±λ±μ±(idempotent)μ κ°λλ‘ νμμμ€. μ¦, λμΌν μ΄λ²€νΈλ₯Ό μ¬λ¬ λ² μ²λ¦¬ν΄λ μλνμ§ μμ λΆμμ©μ΄ λ°μνμ§ μλλ‘ ν΄μΌ ν©λλ€. μ΄λ μ₯μ λ₯Ό μ²λ¦¬νκ³ μ΄λ²€νΈκ° μμ μ μΌλ‘ μ²λ¦¬λλλ‘ νλ λ° μ€μν©λλ€.
- μμ€ν λͺ¨λν°λ§: λ¬Έμ λ₯Ό κ°μ§νκ³ μ§λ¨νκΈ° μν΄ μμ€ν μ λͺ¨λν°λ§νμμμ€. μ΄λ²€νΈ μ§μ° μκ°, λ©μμ§ μ²λ¦¬λ, μ€λ₯μ¨κ³Ό κ°μ μ£Όμ λ©νΈλ¦μ μΆμ νμμμ€.
- λΆμ° μΆμ μ¬μ©: λΆμ° μΆμ μ μ¬μ©νμ¬ μμ€ν μ ν΅ν΄ νλ₯΄λ μ΄λ²€νΈλ₯Ό μΆμ νμμμ€. μ΄λ μ±λ₯ λ³λͺ© νμμ μλ³νκ³ λ¬Έμ λ₯Ό ν΄κ²°νλ λ° λμμ΄ λ μ μμ΅λλ€.
- 보μ κ³ λ €: λ¬΄λ¨ μ‘μΈμ€λ‘λΆν° 보νΈνκΈ° μν΄ μ΄λ²€νΈ λ²μ€μ λ©μμ§ νλ₯Ό 보νΈνμμμ€. μΈμ¦ λ° κΆν λΆμ¬λ₯Ό μ¬μ©νμ¬ μ΄λ²€νΈλ₯Ό λ°ννκ³ κ΅¬λ ν μ μλ μ¬μ©μλ₯Ό μ μ΄νμμμ€.
- μ€λ₯λ₯Ό μ μμ μΌλ‘ μ²λ¦¬: μ₯μ λ₯Ό μ²λ¦¬νκ³ μ΄λ²€νΈκ° μμ μ μΌλ‘ μ²λ¦¬λλλ‘ μ€λ₯ μ²λ¦¬ λ©μ»€λμ¦μ ꡬννμμμ€. μ²λ¦¬ν μ μλ μ΄λ²€νΈλ₯Ό μ μ₯νκΈ° μν΄ λ°λ-λ ν° ν(dead-letter queue)λ₯Ό μ¬μ©νμμμ€.
μ€μ μ¬λ‘
EDA λ° κ΄λ ¨ λ©μμ§ ν¨ν΄μ κ΄λ²μν μ°μ λ° μ ν리μΌμ΄μ μμ μ¬μ©λ©λλ€. λ€μμ λͺ κ°μ§ μμ λλ€:
- μ μμκ±°λ: μ£Όλ¬Έ μ²λ¦¬, μ¬κ³ κ΄λ¦¬, λ°°μ‘ μλ¦Ό.
- κΈμ΅ μλΉμ€: μ¬κΈ° νμ§, κ±°λ μ²λ¦¬, μν κ΄λ¦¬.
- μλ£: νμ λͺ¨λν°λ§, μ½μ μμ½, μλ£ κΈ°λ‘ κ΄λ¦¬.
- IoT: μΌμ λ°μ΄ν° μ²λ¦¬, μ₯μΉ κ΄λ¦¬, μ격 μ μ΄.
- μμ λ―Έλμ΄: νΌλ μ λ°μ΄νΈ, μλ¦Ό, μ¬μ©μ νλ μΆμ .
μλ₯Ό λ€μ΄, κΈλ‘λ² μμ λ°°λ¬ μλΉμ€λ EDAλ₯Ό μ¬μ©νμ¬ μ£Όλ¬Έμ κ΄λ¦¬ν μ μμ΅λλ€. κ³ κ°μ΄ μ£Όλ¬Έμ νλ©΄ `OrderCreated` μ΄λ²€νΈκ° λ°νλ©λλ€. λ μ€ν λ μλΉμ€λ μ΄ μ΄λ²€νΈλ₯Ό ꡬλ νμ¬ μμμ μ€λΉν©λλ€. λ°°λ¬ μλΉμ€λ μ΄ μ΄λ²€νΈλ₯Ό ꡬλ νμ¬ λ°°λ¬ κΈ°μ¬λ₯Ό λ°°μ ν©λλ€. κ²°μ μλΉμ€λ μ΄ μ΄λ²€νΈλ₯Ό ꡬλ νμ¬ κ²°μ λ₯Ό μ²λ¦¬ν©λλ€. κ° μλΉμ€λ λ 립μ μ΄κ³ λΉλκΈ°μ μΌλ‘ μλνμ¬ μμ€ν μ΄ λ§μ μμ μ£Όλ¬Έμ ν¨μ¨μ μΌλ‘ μ²λ¦¬ν μ μλλ‘ ν©λλ€.
κ²°λ‘
μ΄λ²€νΈ κΈ°λ° μν€ν μ²λ νμ₯ κ°λ₯νκ³ , 볡μλ ₯ μμΌλ©°, λΆλ¦¬λ μμ€ν μ ꡬμΆνκΈ° μν κ°λ ₯ν ν¨λ¬λ€μμ λλ€. λ©μμ§ ν¨ν΄μ μ΄ν΄νκ³ ν¨κ³Όμ μΌλ‘ νμ©ν¨μΌλ‘μ¨ κ°λ°μλ λ³ννλ λΉμ¦λμ€ μꡬμ¬νμ μ μν μ μλ κ²¬κ³ νκ³ μ μ°ν μ ν리μΌμ΄μ μ λ§λ€ μ μμ΅λλ€. μ΄ κ°μ΄λλ EDAμμ μ¬μ©λλ μΌλ°μ μΈ λ©μμ§ ν¨ν΄μ λν κ°μμ μ€μ©μ μΈ μμ λ° λͺ¨λ² μ¬λ‘λ₯Ό μ 곡νμ΅λλ€. νΉμ μꡬμ λ§λ μ¬λ°λ₯Έ ν¨ν΄μ μ ννλ κ²μ μ±κ³΅μ μΈ μ΄λ²€νΈ κΈ°λ° μμ€ν μ ꡬμΆνλ λ° λ§€μ° μ€μν©λλ€. κ²°μ μ λ΄λ¦΄ λ μΌκ΄μ±, μ§μ° μκ°, 볡μ‘μ±, νμ₯μ± λ° λ΄κ²°ν¨μ±μ κ³ λ €νλ κ²μ μμ§ λ§μμμ€. λΉλκΈ° ν΅μ μ νμ λ°μλ€μ¬ μ ν리μΌμ΄μ μ μ μ¬λ ₯μ μ΅λν λ°ννμμμ€.